export const networkReg = /^(http|\/\/)/;
export const isBase64 = (path) => /^data:image\/(\w+);base64/.test(path);
export function sleep(delay) {
  return new Promise(resolve => setTimeout(resolve, delay))
}
let {
  platform,
  SDKVersion
} = uni.getSystemInfoSync()
export const isPC = /windows|mac/.test(platform)
// 缓存图片
let cache = {}
export function isNumber(value) {
  return /^-?\d+(\.\d+)?$/.test(value);
}
export function toPx(value, baseSize, isDecimal = false) {
  // 如果是数字
  if (typeof value === 'number') {
    return value
  }
  // 如果是字符串数字
  if (isNumber(value)) {
    return value * 1
  }
  // 如果有单位
  if (typeof value === 'string') {
    const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g
    const results = reg.exec(value);
    if (!value || !results) {
      return 0;
    }
    const unit = results[3];
    value = parseFloat(value);
    let res = 0;
    if (unit === 'rpx') {
      res = uni.upx2px(value);
    } else if (unit === 'px') {
      res = value * 1;
    } else if (unit === '%') {
      res = value * toPx(baseSize) / 100;
    } else if (unit === 'em') {
      res = value * toPx(baseSize || 14);
    }
    return isDecimal ? res.toFixed(2) * 1 : Math.round(res);
  }
  return 0
}

// 计算版本
export function compareVersion(v1, v2) {
  v1 = v1.split('.')
  v2 = v2.split('.')
  const len = Math.max(v1.length, v2.length)
  while (v1.length < len) {
    v1.push('0')
  }
  while (v2.length < len) {
    v2.push('0')
  }
  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i], 10)
    const num2 = parseInt(v2[i], 10)

    if (num1 > num2) {
      return 1
    } else if (num1 < num2) {
      return -1
    }
  }
  return 0
}

function gte(version) {

  return compareVersion(SDKVersion, version) >= 0;
}
export function canIUseCanvas2d() {
  // #ifdef MP-WEIXIN
  return gte('2.9.2');
  // #endif

  // #ifdef MP-TOUTIAO
  return gte('1.78.0');
  // #endif
  return false
}

// #ifdef MP
export const prefix = () => {
  // #ifdef MP-TOUTIAO
  return tt
  // #endif
  // #ifdef MP-WEIXIN
  return wx
  // #endif
  // #ifdef MP-BAIDU
  return swan
  // #endif

  // #ifdef MP-QQ
  return qq
  // #endif
  // #ifdef MP-360
  return qh
  // #endif
}
// #endif



/**
 * base64转路径
 * @param {Object} base64
 */
export function base64ToPath(base64) {
  const [, format] = /^data:image\/(\w+);base64,/.exec(base64) || [];

  return new Promise((resolve, reject) => {
    // #ifdef MP
    const fs = uni.getFileSystemManager()
    //自定义文件名
    if (!format) {
      reject(new Error('ERROR_BASE64SRC_PARSE'))
    }
    const time = new Date().getTime();
    let pre = prefix()
    // #ifdef MP-TOUTIAO
    const filePath = `${pre.getEnvInfoSync().common.USER_DATA_PATH}/${time}.${format}`
    // #endif
    // #ifndef MP-TOUTIAO
    const filePath = `${pre.env.USER_DATA_PATH}/${time}.${format}`
    // #endif
    fs.writeFile({
      filePath,
      data: base64.split(',')[1],
      encoding: 'base64',
      success() {
        resolve(filePath)
      },
      fail(err) {
        console.error(err)
        reject(err)
      }
    })
    // #endif

    // #ifdef H5
    // mime类型
    let mimeString = base64.split(',')[0].split(':')[1].split(';')[0];
    //base64 解码
    let byteString = atob(base64.split(',')[1]);
    //创建缓冲数组
    let arrayBuffer = new ArrayBuffer(byteString.length);
    //创建视图
    let intArray = new Uint8Array(arrayBuffer);
    for (let i = 0; i < byteString.length; i++) {
      intArray[i] = byteString.charCodeAt(i);
    }
    resolve(URL.createObjectURL(new Blob([intArray], {
      type: mimeString
    })))
    // #endif

    // #ifdef APP-PLUS
    const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
    bitmap.loadBase64Data(base64, () => {
      if (!format) {
        reject(new Error('ERROR_BASE64SRC_PARSE'))
      }
      const time = new Date().getTime();
      const filePath = `_doc/uniapp_temp/${time}.${format}`
      bitmap.save(filePath, {},
        () => {
          bitmap.clear()
          resolve(filePath)
        },
        (error) => {
          bitmap.clear()
          reject(error)
        })
    }, (error) => {
      bitmap.clear()
      reject(error)
    })
    // #endif
  })
}

/**
 * 路径转base64
 * @param {Object} string
 */
export function pathToBase64(path) {
  if (/^data:/.test(path)) return path
  return new Promise((resolve, reject) => {
    // #ifdef H5
    let image = new Image();
    image.setAttribute("crossOrigin", 'Anonymous');
    image.onload = function() {
      let canvas = document.createElement('canvas');
      canvas.width = this.naturalWidth;
      canvas.height = this.naturalHeight;
      canvas.getContext('2d').drawImage(image, 0, 0);
      let result = canvas.toDataURL('image/png')
      resolve(result);
      canvas.height = canvas.width = 0
    }
    image.src = path + '?v=' + Math.random()
    image.onerror = (error) => {
      reject(error);
    };
    // #endif

    // #ifdef MP
    if (uni.canIUse('getFileSystemManager')) {
      uni.getFileSystemManager().readFile({
        filePath: path,
        encoding: 'base64',
        success: (res) => {
          resolve('data:image/png;base64,' + res.data)
        },
        fail: (error) => {
          console.error({
            error,
            path
          })
          reject(error)
        }
      })
    }
    // #endif

    // #ifdef APP-PLUS
    plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => {
      entry.file((file) => {
        const fileReader = new plus.io.FileReader()
        fileReader.onload = (data) => {
          resolve(data.target.result)
        }
        fileReader.onerror = (error) => {
          reject(error)
        }
        fileReader.readAsDataURL(file)
      }, reject)
    }, reject)
    // #endif
  })
}



export function getImageInfo(path, useCORS) {
  const isCanvas2D = this && this.canvas && this.canvas.createImage
  return new Promise(async (resolve, reject) => {
    // let time = +new Date()
    let src = path.replace(/^@\//, '/')
    if (cache[path] && cache[path].errMsg) {
      resolve(cache[path])
    } else {
      try {
        // #ifdef MP || APP-PLUS
        if (isBase64(path) && (isCanvas2D ? isPC : true)) {
          src = await base64ToPath(path)
        }
        // #endif
        // #ifdef H5
        if (useCORS) {
          src = await pathToBase64(path)
        }
        // #endif
      } catch (error) {
        reject({
          ...error,
          src
        })
      }
      // #ifndef APP-NVUE
      if (isCanvas2D && !isPC) {
        const img = this.canvas.createImage()
        img.onload = function() {
          const image = {
            path: img,
            width: img.width,
            height: img.height
          }
          cache[path] = image
          resolve(cache[path])
        }
        img.onerror = function(err) {
          reject({
            err,
            path
          })
        }
        img.src = src
        return
      }
      // #endif
      uni.getImageInfo({
        src,
        success: (image) => {
          const localReg = /^\.|^\/(?=[^\/])/;
          // #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO
          image.path = localReg.test(src) ? `/${image.path}` : image.path;
          // #endif
          if (isCanvas2D) {
            const img = this.canvas.createImage()
            img.onload = function() {
              image.path = img
              cache[path] = image
              resolve(cache[path])
            }
            img.onerror = function(err) {
              reject({
                err,
                path
              })
            }
            img.src = src
            return
          }
          // #ifdef APP-PLUS
          // console.log('getImageInfo', +new Date() - time)
          // ios 比较严格 可能需要设置跨域
          if (uni.getSystemInfoSync().osName == 'ios' && useCORS) {
            pathToBase64(image.path).then(base64 => {
              image.path = base64
              cache[path] = image
              resolve(cache[path])
            }).catch(err => {
              console.error({
                err,
                path
              })
              reject({
                err,
                path
              })
            })
            return
          }
          // #endif
          cache[path] = image
          resolve(cache[path])
        },
        fail(err) {
          console.error({
            err,
            path
          })
          reject({
            err,
            path
          })
        }
      })
    }
  })
}


// #ifdef APP-PLUS
const getLocalFilePath = (path) => {
  if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path
    .indexOf('_downloads') === 0) {
    return path
  }
  if (path.indexOf('file://') === 0) {
    return path
  }
  if (path.indexOf('/storage/emulated/0/') === 0) {
    return path
  }
  if (path.indexOf('/') === 0) {
    const localFilePath = plus.io.convertAbsoluteFileSystem(path)
    if (localFilePath !== path) {
      return localFilePath
    } else {
      path = path.substr(1)
    }
  }
  return '_www/' + path
}
// #endif
